/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO.Firebird;

import Biblioteca.VerificacaoErros;
import ClassesUnicas.ImagemApresentadaSubFase;
import DAO.DAOImagemApresentadaSubFase;
import java.io.IOException;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 * DAOImagemApresentadaSubFaseFirebird

 Versao 1.0

 Data Criação 10/11/2013
 *
 * @author Igor
 */
public class DAOImagemApresentadaSubFaseFirebird extends DAOConexaoFirebird implements DAOImagemApresentadaSubFase {
    //Outros metodos
    @Override
    public ImagemApresentadaSubFase buscaImagemApresentadaSubFase(long idRosto, long idExpressao, long intensidade) {
        ResultSet result = null;
        ImagemApresentadaSubFase imagem = null;
        try {
            result = this.select.executeQuery("select * from ( "
                    + "\n select a.*, '1' as SEQUENCIA_IMAGEM,"
                    + " b.DESCRICAO as EXPRESSAO,"
                    + " './banco_de_dados/imagens/'||b.DESCRICAO||'/'||lpad(cast(a.INTENSIDADE as int), 3, '0')||a.ID_ROSTO||'.jpg' as DIRETORIO"
                    + " from IMAGEM a join EXPRESSAO b on b.ID_EXPRESSAO = a.ID_EXPRESSAO "
                    + "\n where a.INTENSIDADE = " + intensidade
                    + "\n and a.ID_ROSTO = " + idRosto
                    + "\n and a.ID_EXPRESSAO = " + idExpressao
                    + "\n ) order by rand()");

            while (result.next()) {
                imagem = new ImagemApresentadaSubFase();

                imagem.setRosto(result.getLong("ID_ROSTO"));
                imagem.setIdExpressao(result.getLong("ID_EXPRESSAO"));
                imagem.setIntensidade(result.getLong("INTENSIDADE"));
                imagem.setDiretorio(constroiDiretorioImagem(result.getString("DIRETORIO")));

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return imagem;
    }

    @Override
    public ArrayList<ImagemApresentadaSubFase> buscaVariasImagensApresentadasSubFase(long intensidade, int repetirImagens) {
        String strSQL = "";

        strSQL = "select NEXT VALUE FOR TMP_SEQUENCE as SEQUENCIA_IMAGEM, a.* from\n"
                + "(";
        for (; repetirImagens > 0; repetirImagens--) {
            strSQL = strSQL + "select\n"
                    + "ID_ROSTO, ID_EXPRESSAO, INTENSIDADE, EXPRESSAO, DIRETORIO\n"
                    + "from (\n"
                    + "select a.*,\n"
                    + "b.DESCRICAO as EXPRESSAO,\n"
                    + "'./banco_de_dados/imagens/'||b.DESCRICAO||'/'||lpad(cast(a.INTENSIDADE as int), 3, '0')||a.ID_ROSTO||'.jpg' as DIRETORIO\n"
                    + "from IMAGEM a join EXPRESSAO b on b.ID_EXPRESSAO = a.ID_EXPRESSAO \n"
                    + "where a.INTENSIDADE = " + intensidade + ")\n";
            if (repetirImagens > 1) {
                strSQL = strSQL + "union all\n";
            }
        }
        strSQL = strSQL + ") a order by rand()";

        ResultSet result = null;
        ArrayList<ImagemApresentadaSubFase> imagens = new ArrayList<>();
        try {
            PreparedStatement stmt;
            stmt = this.con.getCon().prepareStatement("set generator TMP_SEQUENCE to 0");
            stmt.executeUpdate();
            stmt.close();

            result = this.select.executeQuery(strSQL);

            while (result.next()) {
                ImagemApresentadaSubFase imagem = new ImagemApresentadaSubFase();

                imagem.setIdImagemSusFase(result.getLong("SEQUENCIA_IMAGEM"));
                imagem.setRosto(result.getLong("ID_ROSTO"));
                imagem.setIdExpressao(result.getLong("ID_EXPRESSAO"));
                imagem.setIntensidade(result.getLong("INTENSIDADE"));
                imagem.setDiretorio(constroiDiretorioImagem(result.getString("DIRETORIO")));
                imagens.add(imagem);

            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
        return imagens;
    }

    @Override
    public void gravaImagemApresentadaSubFase(long idIstanciaSubFase, ImagemApresentadaSubFase imagem) {
        int acertouErrou = 0; //Errou a resposta
        try {
            if (imagem.getIdExpressaoResposta() != null) {
                if (imagem.getIdExpressao() == imagem.getIdExpressaoResposta()) {
                    acertouErrou = 1; //Acertou a resposta
                }
            }

            CallableStatement cs;
            cs = this.con.getCon().prepareCall("call GRAVA_IMAGEM_SUB_FASE(?,?,?,?,?,?,?,?,?)");

            cs.setLong(1, imagem.getIdImagemSusFase());
            cs.setLong(2, idIstanciaSubFase);
            cs.setLong(3, imagem.getIdRosto());
            cs.setLong(4, imagem.getIdExpressao());
            cs.setInt(5, (int) imagem.getIntensidade());
            cs.setInt(6, 0);
            cs.setInt(7, acertouErrou); //Errou
            if (imagem.getIdExpressaoResposta() != null) {
                cs.setLong(8, imagem.getIdExpressaoResposta());
            } else {
                cs.setNull(8, java.sql.Types.NUMERIC);
            }
            cs.registerOutParameter(9, Types.INTEGER);
            cs.executeQuery();
            //Retorno e gambiarra para funcionar o codigo
            //gambiarra
            long vReturn = cs.getLong(9);

            this.con.getStm().executeBatch();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, VerificacaoErros.retornaMensagemErro(e), "Erro!", JOptionPane.ERROR_MESSAGE);
        }
    }

    @Override
    public Path constroiDiretorioImagem(String dir) throws IOException {
        Path path = Paths.get(dir);
        Path realPath = path.toRealPath(LinkOption.NOFOLLOW_LINKS);
        return realPath;
    }
}
